package uni.edu.pe.analisisSentimental.service.impl;


import static uni.edu.pe.analisisSentimental.common.Constantes.CARACTER_VACIO;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_ANALISIS_SUBJETIVIDAD_JAVA_1;
import static uni.edu.pe.analisisSentimental.common.Constantes.*;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_2;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FINALIDAD_DATA_ENTRENAMIENTO;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_LENGUAJE_CONSULTA_ESPANOL;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_OPINION_NSC;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_OPINION_NEGATIVA;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_OPINION_POSITIVA;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_HABILITADO;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_INHABILITADO;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_POR_PROCESAR;
import static uni.edu.pe.analisisSentimental.common.Constantes.NRO_LLAMADAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.QUERY_EXPRESIONES_NEGATIVAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.QUERY_EXPRESIONES_POSITIVAS;
import static uni.edu.pe.analisisSentimental.common.Constantes.SIMBOLO_TAG;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import twitter4j.HashtagEntity;
import twitter4j.MediaEntity;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.URLEntity;
import twitter4j.UserMentionEntity;
import uni.edu.pe.analisisSentimental.common.Constantes;
import uni.edu.pe.analisisSentimental.dao.GeneralDAO;
import uni.edu.pe.analisisSentimental.dao.HashTagDAO;
import uni.edu.pe.analisisSentimental.dao.MediaDAO;
import uni.edu.pe.analisisSentimental.dao.StatusTweetDAO;
import uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO;
import uni.edu.pe.analisisSentimental.dao.UrlDAO;
import uni.edu.pe.analisisSentimental.dao.UrlProcesadaDAO;
import uni.edu.pe.analisisSentimental.dao.UserMentionDAO;
import uni.edu.pe.analisisSentimental.domain.HashTag;
import uni.edu.pe.analisisSentimental.domain.Media;
import uni.edu.pe.analisisSentimental.domain.PistaSubjetividad;
import uni.edu.pe.analisisSentimental.domain.StatusTweet;
import uni.edu.pe.analisisSentimental.domain.TweetProcesado;
import uni.edu.pe.analisisSentimental.domain.Url;
import uni.edu.pe.analisisSentimental.domain.UrlProcesada;
import uni.edu.pe.analisisSentimental.domain.UserMention;
import uni.edu.pe.analisisSentimental.dto.OpinionMensajeDto;
import uni.edu.pe.analisisSentimental.dto.TweetProcesadoDto;
import uni.edu.pe.analisisSentimental.service.TweetManagerService;
import uni.edu.pe.analisisSentimental.service.common.Utilitario;
import uni.edu.pe.analisisSentimental.service.common.UtilitarioClasificacion;

/**
 * Clase de servicio que provee los metodos correspondientes a las
 * reasignaciones
 * 
 * @author naudante
 * 
 */
@Service
@Qualifier("tweetManagerService")
public class TweetManagerServiceImpl implements TweetManagerService
{
 
    private static Logger logger = LoggerFactory.getLogger(TweetManagerServiceImpl.class);

    @Autowired StatusTweetDAO statusTweetDAO;
    @Autowired UserMentionDAO userMentionDAO;
    @Autowired UrlDAO urlDAO;
    @Autowired HashTagDAO hashTagDAO;
    @Autowired MediaDAO mediaDAO;
    @Autowired TweetProcesadoDAO tweetProcesadoDAO;
    @Autowired GeneralDAO generalDAO;
    @Autowired UrlProcesadaDAO urlProcesadaDAO;
 
 
    /*
     * (non-Javadoc)
     * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#recuperarTweets()
     */
	public void recuperarYPersistirTweets() {
		logger.debug("<==== Inicio Method recuperarTweets a las "+new Date()+" ====>");	
		List<String> lstfuerteNegativa = new ArrayList<String>();
        List<String> lstFuertePositiva = new ArrayList<String>();
        List<PistaSubjetividad> lstPistaTotales = (ArrayList<PistaSubjetividad>)obtenerPistasFuertementeSubjetivas();
        Utilitario.obtenerPistaSubjetividadFuertementeSubjetivas(lstPistaTotales,lstfuerteNegativa,lstFuertePositiva );
        
        List<Status> tweets =null;
        List<String> lstSQueryNegativa = new ArrayList<String>();
        List<String> lstSQueryPositiva = new ArrayList<String>();
        Set<String> setQueryNegativa = new HashSet<String>();
        Set<String> setQueryPositiva = new HashSet<String>();
        String query = null;
        for(String s: lstfuerteNegativa){
        	query = SIMBOLO_TAG+s+CARACTER_VACIO+QUERY_EXPRESIONES_NEGATIVAS;
        	lstSQueryNegativa.add(query);
       }
    	
        for(String s: lstFuertePositiva){
        	query = SIMBOLO_TAG+s+CARACTER_VACIO+QUERY_EXPRESIONES_POSITIVAS;
        	lstSQueryPositiva.add(query);
        }	
        
        
        for(int i=0; i<NRO_LLAMADAS;i++){
        	int pos = (int)Math.floor((Math.random()*lstfuerteNegativa.size()));
        	setQueryNegativa.add(lstSQueryNegativa.get(pos));
        	pos = (int)Math.floor((Math.random()*lstSQueryPositiva.size()));
        	setQueryPositiva.add(lstSQueryPositiva.get(pos));
        }
        if(logger.isDebugEnabled()){
        	logger.debug("setQueryNegativa: size: "+setQueryNegativa.size()+" data: "+setQueryNegativa);
        	logger.debug("setQueryPositiva: size: "+setQueryPositiva.size()+" data: "+setQueryPositiva);
        }
        
        for(String s: setQueryNegativa){
        	tweets = ejecutarQueyEnBaseAConsulta(s);
	    	persistirTweets(tweets, s, COD_OPINION_NEGATIVA, COD_FINALIDAD_DATA_ENTRENAMIENTO);
        }
        tweets = null;
        for(String s: setQueryPositiva){
        	tweets = ejecutarQueyEnBaseAConsulta(s);
	    	persistirTweets(tweets, s, COD_OPINION_POSITIVA, COD_FINALIDAD_DATA_ENTRENAMIENTO);
        }
        tweets = null;
	}	
	
	/**
	 * Metodo que permite crear la consulta en tweeter
	 * en base al texto ingresado en el query.
	 * @param textoConsultaEjecutar
	 * @return 
	 */
    public List<Status> ejecutarQueyEnBaseAConsulta(String textoConsultaEjecutar)
    {
        logger.info("<====  armaQueyEnBaseAConsulta ====>");
        logger.debug("textoConsultaEjecutar: "+textoConsultaEjecutar);

        Twitter twitter = TwitterFactory.getSingleton();
        Query query = new Query(textoConsultaEjecutar);
        query.setLang(COD_LENGUAJE_CONSULTA_ESPANOL); 
        
        return ejecutaQueryEnTwitter(twitter, query);     
        
    }

    /**
     * Metodo que permite ejecutar la sentencia
     * de consulta a tweeter
     * @param twitter
     * @param polaridadIndicada 
     */
	private List<Status>  ejecutaQueryEnTwitter(Twitter twitter, Query query) {
		logger.debug("<====  Inicio Method ejecutaQueryEnTwitter ====>");
		List<Status> tweets = null;
		try {
		
            QueryResult result = twitter.search(query);
            logger.debug("Count : " + result.getTweets().size()) ;
            
            tweets = result.getTweets();
            
        } catch (TwitterException e) {
            logger.error("Error al procesar la consulta a tweeter: ",e);
        }
        return tweets;
	}
	
	public void persistirTweets(List<Status> tweets, String query, String polaridadIndicada, String codFinalidadData){
		logger.debug("<====  Inicio Method persistirTweet ====>");
		StatusTweet dto = null;
		HashTag ht = null;
		Url url = null;
		UserMention um=null;
		Media md = null;
		List<UserMention> ums=null;
		List<HashTag> hts= null;
		List<Url> urls = null;
		List<Media> mds = null;
		UserMentionEntity[] ume = null;
		URLEntity[] urle=null;
		HashtagEntity[] hte=null;
		MediaEntity[] mes=null;
		for (Status tweet : tweets) {

				ums = null;
				hts = null;
				urls = null;
				mds = null;
				ume = null;
				urle = null;
				hte = null;
				mes = null;
				dto = null;
				ht = null;
				url = null;
				um=null;
				md= null;
	            logger.debug("tweet completo: {}", ToStringBuilder.reflectionToString(tweet, ToStringStyle.MULTI_LINE_STYLE));
	         	dto = new StatusTweet();
	         	dto.setId(tweet.getId());
	         	dto.setQuery(query);
	         	dto.setMensaje(tweet.getText());
	         	if(tweet.getUser()!=null){
	         		dto.setScreenNameUser(tweet.getUser().getScreenName());
	         	}	         	
	         	dto.setContadorRetweets((int)tweet.getRetweetCount());
	         	dto.setCodOpinionInicial(polaridadIndicada);
	         	dto.setFechaHoraRegistro(new Date());
	         	dto.setFlagEnProceso(FLAG_POR_PROCESAR);
	         	dto.setCodIdioma(COD_LENGUAJE_CONSULTA_ESPANOL);
	         	dto.setCodFinalidadData(codFinalidadData);
	         	
	         	if(!ArrayUtils.isEmpty(tweet.getUserMentionEntities())){
	         		ums = new ArrayList<UserMention>();
	         		ume = tweet.getUserMentionEntities();
	         		int size = ume.length;
	         		for(int i=0; i<size;i++){
	         			um = new UserMention();
	         			um.setScreenName(ume[i].getScreenName());
	         			um.setIdTweet(tweet.getId());
	         			ums.add(um);
	         		}
	         		
	         	}
	         	
	         	if(!ArrayUtils.isEmpty(tweet.getURLEntities())){
	         		urls = new ArrayList<Url>();
	         		urle = tweet.getURLEntities();
	         		int size = urle.length;
	         		for(int i=0; i<size;i++){
	         			url = new Url();
	         			url.setIdTweet(tweet.getId());
	         			url.setUrlCorta(urle[i].getURL());
	         			url.setUrlLarga(urle[i].getExpandedURL());
	         			url.setUrlMostrada(urle[i].getDisplayURL());
	         			url.setFlagEnProceso(FLAG_POR_PROCESAR);
	         			urls.add(url);
	         		}
	         		
	         	}
	         	
	         	if(!ArrayUtils.isEmpty(tweet.getMediaEntities())){
	         		mds = new ArrayList<Media>();
	         		mes = tweet.getMediaEntities();
	         		int size = mes.length;
	         		for(int i=0; i<size;i++){
	         			md = new Media();
	         			md.setIdTweet(tweet.getId());
	         			md.setUrl(mes[i].getURL());
	         			md.setMediaUrl(mes[i].getMediaURL());
	         			md.setMediaUrlHttps(mes[i].getMediaURLHttps());
	         			md.setExpandedUrl(mes[i].getExpandedURL());
	         			mds.add(md);
	         		}
	         		
	         	}
	         	
	         	if(!ArrayUtils.isEmpty(tweet.getHashtagEntities())){
	         		hts = new ArrayList<HashTag>();
	         		hte = tweet.getHashtagEntities();
	         		int size = hte.length;
	         		for(int i=0; i<size;i++){
	         			ht = new HashTag();
	         			ht.setTextoTag(hte[i].getText());
	         			ht.setIdTweet(tweet.getId());
	         			hts.add(ht);
	         		}
	         		
	         	}
	         	
	         	dto.setUrls(urls);
	         	dto.setUsuariosMencionados(ums);
	         	dto.setHashTags(hts);
	         	dto.setMedias(mds);
	         	
	         	persistirTweet(dto);
				
         }
	}
	/**
	 * Metodo que se encarga de registrar los tweets en la base de datos.
	 * Dado que la llave primaria es el id del tweet, va a haber circunstancias
	 * en que se quiera registrar un tweet registrado con anterioridad, en cuyo caso
	 * solo se ignorara la excepcion, esto para evitar hacer el chequeo de existencia de twwets
	 * en cada oportunidad.
	 * @param tweetBean
	 */
	public void persistirTweet(StatusTweet tweetBean)
	{
		logger.debug("<====  Inicio Method persistirTweets ====>");
		try{
			if(logger.isDebugEnabled()){
				//ToStringBuilder.reflectionToString(tweetBean, ToStringStyle.MULTI_LINE_STYLE);
				logger.debug("tweet completo: {}",ToStringBuilder.reflectionToString(tweetBean));
			}
			int count = 0;
			count =	statusTweetDAO.obtenerContadorEntradasDelTweetEnBD(tweetBean.getId());
			if(count == 0){
				statusTweetDAO.save(tweetBean);
				userMentionDAO.saveAll(tweetBean.getUsuariosMencionados());
				urlDAO.saveAll(tweetBean.getUrls());
				hashTagDAO.saveAll(tweetBean.getHashTags());
				mediaDAO.saveAll(tweetBean.getMedias());				
			}else
			{
				logger.warn("El tweet con id: {}, ya se encontraba registrado: ", tweetBean.getId());
			}
		}
		catch(Exception e)
		{
			logger.error("Error al grabar el tweet: ",e);
		}	
	}



	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#obtenerTweetsPorProcesar()
	 */
	public List<StatusTweet> obtenerTweetsPorProcesar(String codFinData){
		logger.debug("<====  Inicio Method obtenerTweetsPorProcesar ====>");
		return statusTweetDAO.obtenerTweetsPorProcesar(codFinData);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#pasarTweetsProceso(java.util.List)
	 */
	public void pasarTweetsProceso(List<StatusTweet> lst) {
		logger.debug("<====  Inicio Method pasarTweetsProceso ====>");
		List<TweetProcesado> ltp = null;
		if(CollectionUtils.isNotEmpty(lst)){
			TweetProcesado tp =null;
			ltp = new ArrayList<TweetProcesado>();
			for(StatusTweet st: lst){
				tp = new TweetProcesado();
				tp.setIdTweet(st.getId());
				tp.setTextoActual(st.getMensaje());
				tp.setFechaHoraInicio(new Date());
				tp.setFechaHoraFin(null);
				tp.setCodOpinionWeb(null);
				tp.setCodOpinionMensaje(null);
				tp.setCodOpinionTwitter(null);
				tp.setCodFaseTwitter(COD_FASE_INICIO_PROCESO);
				tp.setCodFaseWeb(COD_FASE_PROCESO_NO_INICIADO_WEB);
				tp.setFlagHabilitado(FLAG_HABILITADO);
				ltp.add(tp);
			}
			statusTweetDAO.updatePasadosProcesoBatch(lst);
			tweetProcesadoDAO.saveAllBatch(ltp);
		}
		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#tratarLenguajeTwitter()
	 */
	public void tratarLenguajeTwitter(String codFinData) {
		List<TweetProcesadoDto> ltpDto =obtenerTweetsParaTratamientoLenguaje(codFinData);
		List<TweetProcesadoDto> ltpExitosoDto = null;
		List<Long> lstNs = new ArrayList<Long>();
    	if(CollectionUtils.isNotEmpty(ltpDto)){
    		ltpExitosoDto = new ArrayList<TweetProcesadoDto>();
    		for(TweetProcesadoDto tpdto: ltpDto){
    			String mensaje = tpdto.getTextoInicial();
    			
    			Set<String> setStr = Utilitario.generaSetFromString(mensaje);
    			//Eliminando los RT
    			boolean isRt = Utilitario.isRetweet(setStr);
    			if(isRt){
    				lstNs.add(tpdto.getIdTweet());
    				continue;
    			}
    			//Eliminando los positivos y negativos a la vez
    			boolean isPosNeg = Utilitario.contieneEmoticonosPositivosNegativosEnSubString(mensaje);
    			if(isPosNeg){
    				lstNs.add(tpdto.getIdTweet());
    				continue;
    			}
    			
    			//Eliminando los ambiguos
    			boolean isEmAmbiguo = Utilitario.contieneEmoticonoAmbiguoEnSubstring(mensaje);
    			if(isEmAmbiguo){
    				lstNs.add(tpdto.getIdTweet());
    				continue;
    			} 
    			
    			//Eliminando los emoticonos
    			mensaje = Utilitario.removerMarcasDeTexto(mensaje, Utilitario.obtenerEmoticonosTotales());
    			
    			//Convirtiendo a minuscula
    			mensaje = mensaje.toLowerCase();
    			
    			//Eliminando @marcas de usuario, #HashTags y Url 
    			String txtSinMarcas = Utilitario.removerMarcasDeTexto(mensaje, tpdto.getMarcasMensaje());
    			tpdto.setTextoProcesado(txtSinMarcas);
    			ltpExitosoDto.add(tpdto);
    		}
    		guardarTextoProcesadoTratamientoTwitter(ltpExitosoDto);
    		tweetProcesadoDAO.descartarTweetsNSBatch(lstNs);
    	}	
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#obtenerTweetsParaTratamientoLenguaje()
	 */
	public List<TweetProcesadoDto> obtenerTweetsParaTratamientoLenguaje(String codFinData) {
		return tweetProcesadoDAO.obtenerTweetsParaTratamientoLenguaje(codFinData);
	}

	/**
	 * 
	 */
	public void guardarTextoProcesadoTratamientoTwitter(
			List<TweetProcesadoDto> ltpdto) {
		tweetProcesadoDAO.guardarTextoProcesadoTratamientoTwitterBatch(ltpdto);
		
	}


	public void actualizarTweetsProcesadosRM() {
		tweetProcesadoDAO.actualizarTweetsProcesadosRM();
		tweetProcesadoDAO.limpiarDataTratamientoLenguajeRM();
	}

	public Map<String,String> obtenerJergasInternetTest() {
		return generalDAO.obtenerJergasInternet();
		
	}


	public void tratarLenguajePostRM(Map<String, String> mapJergas, Set<String> setDiccionario, Set<String> setDiccAgregar, String codFinData) {
		List<TweetProcesado> ltp = tweetProcesadoDAO.obtenerTweetsParaTratamientoLenguajePostRM(codFinData);
		for(TweetProcesado tp:ltp){
			String msg = tp.getTextoActual();
			
			logger.debug("msg antes: "+msg);
			msg = Utilitario.corrigeParrafo(msg, mapJergas, setDiccionario, setDiccAgregar);
			logger.debug("msg despues: "+msg);
			
			tp.setTextoActual(msg);
			tp.setCodFaseTwitter(COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_2);
		}
		tweetProcesadoDAO.guardarTweetsTratadosPorFaseTwitterBatch(ltp);
		
	}

	public Map<String, PistaSubjetividad> obtenerPistasSubjetividad() {
		return generalDAO.obtenerPistasSubjetividad();
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#procesarSubjetividadCo(java.util.Map)
	 */
	public void procesarSubjetividadCo(Map<String, PistaSubjetividad> mapPistas, String codFinData) {
		String texto;
		String orientacionSubj;
		List<TweetProcesado> ltp = tweetProcesadoDAO.obtenerTweetsParaAnalisisSubjetividadCo(codFinData);
		for(TweetProcesado tp : ltp){
			texto = tp.getTextoActual();
			
			orientacionSubj = UtilitarioClasificacion.obtenerOrientacionSubjetividad(texto, mapPistas);
			
			tp.setCodOpinionTwitter(orientacionSubj);
			tp.setCodFaseTwitter(COD_FASE_ANALISIS_SUBJETIVIDAD_JAVA_1);
			
			if(COD_OPINION_NSC.equals(orientacionSubj)){
				tp.setFlagHabilitado(FLAG_INHABILITADO);
			}
		}
		
		//Actualiza los registros en Tweets Procesados
		tweetProcesadoDAO.guardarTweetsTratadosPorFaseTwitterBatch(ltp);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#obtenerPistasFuertementeSubjetivas()
	 */
	public List<PistaSubjetividad> obtenerPistasFuertementeSubjetivas() {
		return generalDAO.obtenerPistasFuertementeSubjetivas();
	}

	public List<Url> obtenerUrlsPorProcesar(String codFinData) {
		return urlDAO.obtenerUrlsPorProcesar(codFinData);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#pasarUrlProceso(java.util.List, java.util.List)
	 */
	public void pasarUrlProceso(List<Url> lstUrl,
			List<UrlProcesada> lstUrlProcesada) {
		logger.debug("<==== Inicio Method pasarUrlProceso ====>");
		urlProcesadaDAO.grabarUrlProcesadaBatch(lstUrlProcesada);
		urlDAO.actualizarFlagDeProcesoUrlBatch(lstUrl);
		tweetProcesadoDAO.actualizarFaseTweetsProcesadosWebBatch(lstUrl);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#actualizarTweetsProcesadosC1()
	 */
	public void actualizarTweetsProcesadosC1() {
		tweetProcesadoDAO.actualizarTweetsProcesadosC1();
		tweetProcesadoDAO.limpiarDataTratamientoLenguajeRM();
	}
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#actualizarTweetsProcesadosC2()
	 */
	public void actualizarTweetsProcesadosC2() {
		tweetProcesadoDAO.actualizarTweetsProcesadosC2();
		tweetProcesadoDAO.limpiarDataTratamientoLenguajeRM();
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#sintetizarOpinionMensaje(java.lang.String)
	 */
	public void sintetizarOpinionMensaje(String codFinalidadData) {
		logger.debug("<==== Inicio Method sintetizarOpinionMensaje ====>");
		List<OpinionMensajeDto> lstOm = generalDAO.obtenerOpinionMensaje(codFinalidadData);
		for(OpinionMensajeDto om: lstOm){
			if(Constantes.COD_OPINION_OBJETIVA.equals(om.getCodOpinionTwitter())){
				om.setCodOpinionMensaje(om.getCodOpinionWeb());
			}else{
				om.setCodOpinionMensaje(om.getCodOpinionTwitter());
			}
			if(StringUtils.isNotBlank(om.getOpiIniTweet())){
				if(StringUtils.isBlank(om.getOpiIniWeb())){
					om.setCodOpinionMsjInicial(om.getOpiIniTweet());
				}else{
					if(Constantes.COD_OPINION_OBJETIVA.equals(om.getOpiIniTweet())){
						om.setCodOpinionMsjInicial(om.getOpiIniWeb());
					}else if(om.getOpiIniTweet().equals(om.getOpiIniWeb())){
						om.setCodOpinionMsjInicial(om.getOpiIniTweet());
					}else {
						om.setCodOpinionMsjInicial(COD_OPINION_NSC);
					}
				}
			}else{
				om.setCodOpinionMsjInicial(Constantes.COD_OPINION_NSC);
			}			
		}
		
		tweetProcesadoDAO.sintetizarOpinionMensajeBatch(lstOm);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#evaluarPerformance(java.lang.String)
	 */
	public void evaluarPerformance(String codFinalidadData) {
		logger.debug("<==== Inicio Method evaluarPerformance =====>");
		List<TweetProcesado> lstTp = tweetProcesadoDAO.obtenerTweetsEvaluacionPerformance(codFinalidadData);
		int countVp=0;
		int countFp=0;
		int countFn=0;
		int countVn=0;
		double recall = 0;
		double precision = 0;
		//TODO: Preguntar si se llama asi
		double errorTotal = 0;
		for(TweetProcesado tp:lstTp){
			if(Constantes.COD_OPINION_POSITIVA.equals(tp.getCodOpinionMensaje())&&
			   Constantes.COD_OPINION_POSITIVA.equals(tp.getCodOpinionMsjInicial())){
				countVp++;
			}else if(Constantes.COD_OPINION_POSITIVA.equals(tp.getCodOpinionMensaje())&&
			   Constantes.COD_OPINION_NEGATIVA.equals(tp.getCodOpinionMsjInicial())){
				countFp++;
			}else if(Constantes.COD_OPINION_NEGATIVA.equals(tp.getCodOpinionMensaje())&&
			   Constantes.COD_OPINION_POSITIVA.equals(tp.getCodOpinionMsjInicial())){
				countFn++;
			}else if(Constantes.COD_OPINION_NEGATIVA.equals(tp.getCodOpinionMensaje())&&
			   Constantes.COD_OPINION_NEGATIVA.equals(tp.getCodOpinionMsjInicial())){
				countVn++;
			}
		}
		
		recall = (double)countVp/(countVp+countFn);
		precision = (double)countVp/(countVp+countFp);
		errorTotal = (double)(countVp+countVn)/(countVp+countFp+countFn+countVn);
		
		logger.debug("Armando la Matriz de Confusion");
		logger.debug("==============================");
		logger.debug("countVp: {}",countVp);
		logger.debug("countFp: {}",countFp);
		logger.debug("countFn: {}",countFn);
		logger.debug("countVn: {}",countVn);
		logger.debug("recall: {}",recall);
		logger.debug("precision: {}",precision);
		logger.debug("errorTotal: {}",errorTotal);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#actualizarUrlsProcesadasC1()
	 */
	public void actualizarUrlsProcesadasC1() {
		tweetProcesadoDAO.actualizarUrlsProcesadasC1();
		tweetProcesadoDAO.limpiarDataTratamientoLenguajeRM();
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.service.TweetManagerService#actualizarUrlsProcesadasC2()
	 */
	public void actualizarUrlsProcesadasC2() {
		tweetProcesadoDAO.actualizarUrlsProcesadasC2();
		tweetProcesadoDAO.limpiarDataTratamientoLenguajeRM();		
	}

}